package Thread.Synchroized02;

/*
注意：同步方法就是本实现类的对象，也就是this，也就是runnable01

    卖票案例出现了线程安全问题
        卖出了不存在和重复的票

    解决线程安全问题的一种方案：使用同步方法
    格式：
       修饰符 synchroized  返回值类型  方法名 （参数列表）{
            可能会出现线程安全问题的代码
       }

*/
public class Runnable01 implements Runnable {
    //指定票数为100
    private int tickets = 100;

    @Override
    public void run() {
        while (true) {
            sellTicket();
        }
    }
    //定义一个同步方法
/*
    同步方法也会把内部的代码锁住，只允许一个线程执行
    同步方法锁对象是 实现类对象 Runnable01
*/
    public synchronized void sellTicket() {
        if (tickets > 0) {
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("正在卖地第" + tickets + "张票");
            tickets--;
        }
    }
}
